package com.springStudy.com.aopStudy.dynamicProxy;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/*
JDK的动态代理工厂
 */
public class JDKDynamicProxyFactory {

    private Object target;

    public JDKDynamicProxyFactory(Object target) {
        this.target = target;
    }

    public Object getProxy() {

        /*
        newProxyInstance():创建一个代理实例
        其中有三个参数:
        1、classLoader：加载动态生成的代理类加载器
        2、interfaces：目标对象实现的所有接口的class对象所组成的数组
        3、invocationHandler：设置代理对象实现目标对象方法的过程，即代理类中如何重写接口中的抽象方法

         */
        ClassLoader classLoader = target.getClass().getClassLoader();
        Class<?>[] interfaces = target.getClass().getInterfaces();
        InvocationHandler invocationHandler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                /*
                proxy：代理对象
                method：代理对象需要实现的方法，即其中需要重写的方法
                args：method对应方法的参数
                 */
                Object result = null;
                try {
                    System.out.println("[动态代理][日志]" + method.getName() + "，参数：" + Arrays.toString(args));
                    // 通过反射调用执行目标方法
                    result = method.invoke(target, args);
                    System.out.println("[动态代理][日志]" + method.getName() + "，结果：" + result);
                } catch (Exception e) {
                    e.printStackTrace();
                    System.out.println("[动态代理][日志]" + method.getName() + "，异常：" + e.getMessage());
                } finally {
                    System.out.println("[动态代理][日志]" + method.getName() + "，方法执行完毕！");
                }
                return result;
            }
        };
        return Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
    }
}
